package hash.hashmap7;

public class Utils {

    /**
     * 返回 大于 给定值的 number的2的整数倍的数
     * @param number
     * @param max
     * @return
     */
    public static int roundUpToPowerOf2(int number,int max) {
        return number >= max ? max : (number > 1) ? Integer.highestOneBit((number - 1) << 1) : 1;
    }


    public static final int hash(Object k) {
        int h = 31;
        if (0 != h && k instanceof String) {
            return System.identityHashCode((String) k);
        }

        h ^= k.hashCode();

        //int 32 位的 高位和地位都参与hash运算，更加均匀一些
        h ^= (h >>> 20) ^ (h >>> 12);

        return h ^ (h >>> 7) ^ (h >>> 4);
    }


    /**
     *
     * 举例：
     * length 16   ：      0001 0000
     * length-1    ：      0000 1111
     *
     * 如果入参h  0101 0101
     *
     * h & (length-1)
     *    0000 1111
     *  & 0101 0101
     *  --------------
     *    0000 0101
     *
     * 结论 如果length 为2的整数倍，那么 length -1 后，会得到 length 的二进制第一位不为零的数变为零，后边所有位数变为1
     * 与上任何一个数之后拿到的结果肯定小于length
     *
     */
    public static int indexFor(int h, int length) {
        return h & (length-1);
    }

}
